iT邦幫忙

2022 iThome 鐵人賽

DAY 26
0
Software Development

C++超級菜鳥也可以懂的物件導向攻略系列 第 26

Day 26 C++ 物件導向7 Polymorphism

  • 分享至 

  • xImage
  •  

前言:哎~關於polymorphism是什麼我花好幾天翻了課本不懂、估狗過也不懂、查Youtube也沒怎麼聽懂。

今天就來試著用白話文把他形容出來。

如同之前說到的物件導向概念是用來節省code行數,進而達到省時省力省眼睛防止肩膀酸痛的功效。

  • class是分裝箱,讓我們不用重複寫一樣的function還有variable,更改時也只需要更動其中一項即可。
  • 繼承inheritance讓我們能在同樣的class模子下做出好多個類似的東西。
  • Polymorphism是跟繼承的時候才可以用到的功能

注:method是class裡面的function
注:因為C++是靜態語言,如果沒有class就沒有繼承,沒有inheritance也沒有polymorphism了喔*。

建議先讀過物件導向系列文章:
Pointer、Dynamic memory、物件導向系列文章(尤其是Inheritence)


今天聊的是Runtime\dynamic Polymorphism,在程式一邊跑的時候才知道下一步通往哪裡,有點像在走迷宮。事先沒有地圖,要到裡面之後才知道下一步通往哪裡。

Polymorphism三步驟

  1. Inheritance
  2. Overloading
  3. Overriding

Inheritance

假設一家人都會跳跟跑步,但高度跟速度不同。
例如:媽媽:跳70公分,跑步速度中等,爸爸跳60公分,跑步速度快,
簡單做出繼承:
先做出class跟兩個sub class。

class Family{
public:
    void jump(){
        cout << "Family average jump 50cm";
    }
    void run(){
        cout <"Family average run fast";
    }
};
class Mom:public Family{
public:
    void jump(){
        cout <<"Mom jumps 70cm";
    }
    void run(){
        cout <<"run normal";
        }
};
class Dad:public Family{
public:
    void jump(){
        cout <<"Dad jumps 60cm";
    }
    void run(){
        cout <<"run fast";
        }
};

Overidding

當我們在呼叫時,會像下面這樣一行一行呼叫嘛:

  Mom m;
  Dad d;
  m.jump();  
  m.run();
  d.jump();
  d.run();

因為class Mom和class Dad已經定義好各自的object m和objct d,所以會直接取用到class Mom跟class Dad的的method。

把之前一樣名字的function覆蓋掉,就是overriding。


Overidding

如果我們事先不知道要叫誰的資料出來,例如給user選擇要看媽媽還是爸爸的資料,
那就必須把這個變成function(user的選擇);

這種會因為argument不同產生不同結果的情況叫做overloading

啊因為是在程式執行時才知道的東西,這個方式稱為動態記憶體(請搭直通車Dynamic memory),所以要用到pointer。

    Family f;
    Mom m;
    Dad d;
    Family *f1 = &m; //把f1對準m的位址
    Family *f2 = &d; //把f2對準d的位址
  
    f1 -> setname("Sophia");
    cout << m.getname() << endl;

更白話一點來說,f1裡面放的就是Mom的object m的記憶體地址。
所以可以在f1裡面操作放進m的名字。

下面這兩個寫法是一樣的意思

  • f1.setname();
  • f1->setname();

完整程式示範如何讓使用者輸入爸媽的名字:

#include <iostream>

using namespace std;
class Family{
    protected:
    string Name;
public:
    void setname(string name){
        Name = name;
    }
    string getname(){
        return Name;
    }
};

class Mom:public Family{
public:
    string getname(){
        return "Mom's name is " + Name;
    }
    
};
class Dad:public Family{
public:
     string getname(){
        return "Dad's name is "+ Name;
    }
  
};
int main()
{   
    string x, y;
    Family f;
    Mom m;
    Dad d;
    Family *f1 = &m;
    Family *f2 = &d;
    
    cout <<"Type mom's name: ";
    cin >> x;
    f1 -> setname(x);
    cout <<"Type dad's name: ";
    cin >> y;
    f2 -> setname(y);
    
    cout << m.getname() << endl;
    cout << d.getname() << endl;
    return 0;
}

昨天的文章第二個Hackerank題目Ingeritance的int main裡面有一個東西,也有用到pointer喔~

小總結,polymorphism的意思就是

引用自stackify.com
“It describes the concept that you can access objects of different types through the same interface.”

下一篇來聊聊virtuel function。

Reference: Practical C++ Programming, The Cherno, thenewboston, w3cschool, geeksforgeeks, cplusplus, programiz, CodeBeuty, https://www.udacity.com/blog/2021/07/understanding-polymorphism-in-cpp.html, freecodecamp


上一篇
Day 25 C++ Polymorphism前言 - Dynamic memory和Pointer to structures
下一篇
Day 27 C++ 虛擬貨幣 Crypto bot - 把之前的code變成 function
系列文
C++超級菜鳥也可以懂的物件導向攻略30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
dannylin
iT邦新手 5 級 ‧ 2023-02-08 10:35:32

[勘誤]
overloading的標題寫成Overidding囉

我要留言

立即登入留言